//
//  ProtocolsTest.swift
//  BJ12366Swift
//
//  Created by ZRAR on 16/2/29.
//  Copyright © 2016年 ZRAR. All rights reserved.
//

import UIKit

class ProtocolsTest: NSObject {
    
   
    struct Person:FullyNamed {
        
        var fullName:String
    }
    func fullNameTest(){
        let john = Person(fullName: "John Appleseed")
        var d6 = Dice(sides: 6, generator: RandomClass())
        print("RANDOM dice roll is\(d6.roll())")
    }
 

}

class RandomClass:SomeFuncProtocol {
    
    static func someTypeMethod() {
        
    }
    func random() -> Double {
        
        return 0.1
    }
}

//对属性的规定
protocol SomeProtocol{
    
    var mustBeSettable:Int{get set}
    var doesNotNeedToBeSettable:Int{get}
    
}

protocol AnotherProtocol{
    
    static var someTypeProperty:Int{get set}
}

protocol FullyNamed{
    
    var fullName:String{get}
}

//对方法的规定
protocol SomeFuncProtocol{
    //类方法
    static func someTypeMethod()
    //实例方法
    func random()->Double
}

//对Mutating方法的规定
//用类实现协议中的mutating方法时，不用写mutating关键字，用结构体，枚举实现协议中的mutating方法时，必须写mutating关键字
protocol Togglable{
    
    mutating func toggle()
}

//协议类型
class Dice{
    
    let sides:Int
    //generator属性的类型为SomeFuncProtocol，因此任何遵循了SomeFuncProtocol协议类型的实例都可以赋值给generator，除此之外，无其他要求
    let generator:SomeFuncProtocol
    init(sides:Int,generator:SomeFuncProtocol){
        
        self.sides = sides
        self.generator = generator
        
    }
    func roll()->Int{
        
        return Int(generator.random()*Double(sides)+1)
    }
    
}
//类专属协议
//只能被类（class）类型适配
protocol SomeClassOnlyProtocol:class{
    
}
//对可选协议的规定：可选协议只能在含有@objec前缀的协议生效。

@objc protocol CounterDataSource{
    
    optional func incrementForCount(count:Int)->Int
    optional var fixedIncrenebt:Int{get}
}